rusotoでリトライを実装する
rusotoでAPIレスポンスに応じたリトライを実装する場合dynamiteでの実装が簡潔に参考になります。
はじめに
オフィシャルのRust AWS SDKが公開されて久しいですがまだrusotoを使っている人は多いと思いいます。今回rusotoに実装されていないけどよく使う2つの機能を自前で実装してみたのでそれぞれ記事にしたいと思います。
やったこと
- 各AWSサービスクライアントのAPIをタイムアウト付きで実行する (前回)
- 各AWSサービスのレスポンスに応じてリトライを実行する ← 今回はこっち
dynomiteでの実装
rusotoをラップしたDynamoDB用のcrate dynomite でリトライが比較的簡潔に実装されているので参考にしました。ここでは実装の概要を紹介します。
- 実処理の再実行、スリープなどの実装はagain crateを使う
- 自前で定義するリトライポリシー RetryからagainのRetryPolicyへの変換を定義しておく
- リトライするかどうかを判定するtrait Retryを定義してAPIのレスポンスの型ごとにインスタンスを定義する
- インスタンスの定義は
retry!
マクロで行う https://github.com/softprops/dynomite/blob/master/dynomite/src/retry.rs#L886-L903
DynamoDB on local stackでのリトライのテスト
DynamoDBとkinesis限定になりますが、localstackのオプションを使うことでランダムにスロットリングエラーを発生させることができます。スロットリング起因のリトライをテストするにはこれを使いました。
以下の環境変数にスロットリングが発生する確率を0〜1の範囲で指定します。
- DDBの場合:
DYNAMODB_ERROR_PROBABILITY
- Kinesisの場合:
KINESIS_ERROR_PROBABILITY
まとめ
dynamiteでの実装を参考にしてrusotoでリトライ処理を実装しました。